use std::rc::Rc;
use crate::List::{Cons, Nil};

// 通过Rc<T> 允许程序的多个部分之间只读的共享数据，因为相同位置的多个可变引用可能会造成数据的竞争和不一致
enum List {
    Cons(i32, Rc<List>),
    Nil,
}

fn main() {
    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
    println!("count after creating a = {}", Rc::strong_count(&a)); // 打印计数 a = 1
    let b = Cons(3, Rc::clone(&a));
    println!("count after creating b = {}", Rc::strong_count(&a)); // 打印计数 a = 2
    {
        let c = Cons(4, Rc::clone(&a));
        println!("count after creating c = {}", Rc::strong_count(&a)); // 打印计数 a = 3
    }
    // 这里为什么等于2，原因是当离开了c的作用域，计数需要减1，所以等于2
    println!("count after c goes out of scope = {}", Rc::strong_count(&a)); // 打印计数 a = 2
    println!("Hello, world!");
}
